package base_grammar

import (
	"fmt"
	"math"
	"unsafe"
)

func Number_f3() {
	var myfloat float32 = 10000018
	// 计算是精确的  因为float32可以保证小数点后7位进度
	fmt.Printf("myfloat: %v\n", myfloat)
	fmt.Printf("(myfloat + 1): %v\n", (myfloat + 1))

	var myfloat1 float32 = 100000182
	var myfloat2 float32 = 100000187
	// 计算是不精确的 小数点后面有8位
	fmt.Printf("myfloat1: %v\n", myfloat1)
	fmt.Printf("myfloat1: %v\n", myfloat1+5)
	fmt.Println(myfloat1+5 == myfloat2)
	// 由于进度问题  这里会返回true
	fmt.Println(myfloat1+1 == myfloat1)
}

func number_f2() {
	//num()
	//jinzhi()

	fmt.Printf("%f\n", math.Pi)
	fmt.Printf("%.2f\n", math.Pi)

	var c1 complex64
	c1 = 1 + 2i
	var c2 complex128
	c2 = 2 + 3i
	fmt.Println(c1)
	fmt.Println(c2)

}
func jinzhi() {

	/*
		%b    表示为二进制
		%c    该值对应的unicode码值
		%d    表示为十进制
		%o    表示为八进制
		%q    该值对应的单引号括起来的go语法字符字面值，必要时会采用安全的转义表示
		%x    表示为十六进制，使用a-f
		%X    表示为十六进制，使用A-F
		%U    表示为Unicode格式：U+1234，等价于"U+%04X"
		%E    用科学计数法表示
		%f    用浮点数表示
	*/

	// 十进制
	var a int = 10
	fmt.Printf("%d \n", a) // 10
	fmt.Printf("%b \n", a) // 1010  占位符%b表示二进制

	// 八进制  以0o开头
	var b int = 0o77
	fmt.Printf("%o \n", b)
	fmt.Printf("%d \n", b)

	// 十六进制  以0x开头
	var c int = 0xff
	fmt.Printf("%x \n", c) // ff
	fmt.Printf("%X \n", c) // FF
	fmt.Printf("%d \n", c) // FF
}

func num_f1() {
	var i8 int8
	var i16 int16
	var i32 int32
	var i64 int64
	var ui8 uint8
	var ui16 uint16
	var ui32 uint32
	var ui64 uint64

	fmt.Printf("%T %dB %v~%v\n", i8, unsafe.Sizeof(i8), math.MinInt8, math.MaxInt8)
	fmt.Printf("%T %dB %v~%v\n", i16, unsafe.Sizeof(i16), math.MinInt16, math.MaxInt16)
	fmt.Printf("%T %dB %v~%v\n", i32, unsafe.Sizeof(i32), math.MinInt32, math.MaxInt32)
	fmt.Printf("%T %dB %v~%v\n", i64, unsafe.Sizeof(i64), math.MinInt64, math.MaxInt64)

	fmt.Printf("%T %dB %v~%v\n", ui8, unsafe.Sizeof(ui8), 0, math.MaxUint8)
	fmt.Printf("%T %dB %v~%v\n", ui16, unsafe.Sizeof(ui16), 0, math.MaxUint16)
	fmt.Printf("%T %dB %v~%v\n", ui32, unsafe.Sizeof(ui32), 0, math.MaxUint32)
	fmt.Printf("%T %dB %v~%v\n", ui64, unsafe.Sizeof(ui64), 0, uint64(math.MaxUint64))

	var f32 float32
	var f64 float64

	fmt.Printf("%T %dB %v~%v\n", f32, unsafe.Sizeof(f32), -math.MaxFloat32, math.MaxFloat32)
	fmt.Printf("%T %dB %v~%v\n", f64, unsafe.Sizeof(f64), -math.MaxFloat64, math.MaxFloat64)

	var ui uint
	ui = uint(math.MaxUint64) //再+1会导致overflows错误
	fmt.Printf("%T %dB %v~%v\n", ui, unsafe.Sizeof(ui), 0, ui)

	var imax, imin int
	imax = int(math.MaxInt64) //再+1会导致overflows错误
	imin = int(math.MinInt64) //再-1会导致overflows错误

	fmt.Printf("%T %dB %v~%v\n", imax, unsafe.Sizeof(imax), imin, imax)

}
